// 获取配置文件
import config from './config'

// 获取路径转换成驼峰式命名方式,如果目录与文件夹名称相同，则保留目录名称
function requireAll(arr) {
	// console.log(arr.length)
	let name = ''
	arr.map(v => {
		// 转换成驼峰式命名方式
		const fileName = v.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())
		// 如果目录与文件夹名称相同，则保留目录名称
		if (arr.length === 2) {
			if (name !== fileName) {
				name += fileName
			}
		}
	})
	return name
}

// 自动扫描注册API接口
function scanApi() {
	let modules = {}
	// 自动化扫描API文件
	const files = require.context('@/api', true, /\.js$/)
	// console.log(files);
	files.keys().forEach(key => {
		// 获取文件路径
		const path = key.replace(/\.\/|\.js/g, '')
		modules[requireAll(path.split('/'))] = files(key).default
	})

	// 返回API
	return modules;
}

const install = (Vue, vm) => {

	// 设置全局默认配置
	vm.$u.http.setConfig({
		// 请求的根域名
		baseUrl: config.domain
	});

	// 请求拦截，配置Token等参数
	vm.$u.http.interceptor.request = (config) => {
		// 获取应用全局状态vuex_token
		const {
			vuex_token,
			vuex_p_token
		} = vm

		config.header.Token = vuex_token || ''
		config.header.AppToken = vuex_p_token || ''

		return config;
	};

	// 响应拦截，判断状态码是否通过
	vm.$u.http.interceptor.response = (response) => {
		
		if (response.statusCode === 200) {
			const {
				code,
				msg,
				data
			} = response.data

			// 打印数据
			console.log("打印请求 ->");
			console.log(response);

			// 处理请求
			if (code === 20000) {
				// 处理正常请求
				return data
			} else if (code === 1000) {
				return response.data
			} else {
				// 接口异常提示
				if (code === 50002) {
					// 提示操作
					uni.showModal({
						title: "提示",
						content: msg,
						showCancel: false,
						success: () => {}
					});
					return false
				}

				// 未知异常提示
				vm.$u.toast(msg || 'Error');
				return false
			}

		} else {
			console.log(response);
			// 服务器状态码不为200,则提示
			const {
				statusCode
			} = response
			let msg;
			if (response) {
				switch (statusCode) {
					case 400:
						msg = '错误请求'
						break
					case 401:
						msg = '未授权,请重新登录'
						break
					case 403:
						msg = '拒绝访问'
						break
					case 404:
						msg = '请求服务不存在'
						break
					case 405:
						msg = '请求方法未允许'
						break
					case 408:
						msg = '请求超时'
						break
					case 500:
						msg = '服务器异常'
						break
					case 502:
						msg = '网络错误'
						break
					case 504:
						msg = '网络超时'
						break
					case 505:
						msg = 'HTTP版本不受支持'
						break
					default:
						msg = '错误代码:' + statusCode
				}
			} else {
				msg = '网络出现问题,请稍后再试'
			}
			// 提示信息
			vm.$u.toast(msg || 'Error');
			return false;
		}

	};

	// 自动扫描API文件
	vm.$u.api = scanApi()

	// 开发模式打印日志
	if (process.env.NODE_ENV === 'development') {
		console.log('-------------------------------');
		console.log('>>> 自动扫描 -> API');
		console.log('-------------------------------');
		console.log(vm.$u.api);
		console.log('-------------------------------');
	}

}

export default {
	install
}